﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace SVC_DAL
{
    public class ContasAReceberDAL
    {
        Dados objD = null;

        public ContasAReceberDAL()
        { }

        //inserção
        public int inserir(int venda, DateTime vencimento, Double original, Double alterado, Double pago, String status, DateTime? pagamento,
            Double juros, Double desconto, String observacao, String parcela, Double? cr_valorRestante, Double? cr_multa)
        {
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "INSERT INTO ContasAReceber (cr_vendas, cr_dataVencimento, cr_valorOriginal, cr_valorAlterado,"+
                " cr_valorPago, cr_status, cr_dataPagamento, cr_juros, cr_desconto, cr_observacao, cr_parcela,cr_valorRestante, cr_multa)" +
                " VALUES(@venda, @vencimento, @original, @alterado, @pago, @status, @pagamento, @juros, @desconto, @observacao," +
                " @parcela,@cr_valorRestante,@cr_multa)";
                cmd.Parameters.Add(new SqlParameter("@venda", SqlDbType.Int)).Value = venda;
                cmd.Parameters.Add(new SqlParameter("@vencimento", SqlDbType.DateTime)).Value = vencimento;
                cmd.Parameters.Add(new SqlParameter("@original", SqlDbType.Float)).Value = original;
                cmd.Parameters.Add(new SqlParameter("@alterado", SqlDbType.Float)).Value = alterado;
                cmd.Parameters.Add(new SqlParameter("@pago", SqlDbType.Float)).Value = pago;
                cmd.Parameters.Add(new SqlParameter("@status", SqlDbType.VarChar)).Value = status;
                if(pagamento != null)
                cmd.Parameters.Add(new SqlParameter("@pagamento", SqlDbType.DateTime)).Value = pagamento;
                else
                    cmd.Parameters.Add(new SqlParameter("@pagamento", SqlDbType.DateTime)).Value = DBNull.Value;
                cmd.Parameters.Add(new SqlParameter("@juros", SqlDbType.Float)).Value = juros;
                cmd.Parameters.Add(new SqlParameter("@desconto", SqlDbType.Float)).Value = desconto;
                cmd.Parameters.Add(new SqlParameter("@observacao", SqlDbType.VarChar)).Value = observacao;
                cmd.Parameters.Add(new SqlParameter("@parcela", SqlDbType.VarChar)).Value = parcela;
                if (cr_valorRestante != null)
                    cmd.Parameters.Add(new SqlParameter("@cr_valorRestante", SqlDbType.Float)).Value = cr_valorRestante;
                else
                    cmd.Parameters.Add(new SqlParameter("@cr_valorRestante", SqlDbType.Float)).Value = DBNull.Value;
                if (cr_multa!= null)
                    cmd.Parameters.Add(new SqlParameter("@cr_multa", SqlDbType.Float)).Value = cr_multa;
                else
                    cmd.Parameters.Add(new SqlParameter("@cr_multa", SqlDbType.Float)).Value = 0;
                //objD.executacomando(cmd);
                //cmd = null;
                //objD = null;

                int codigo = objD.executacomandoInsert(cmd, "ContasAReceber");
                cmd = null;
                objD = null;
                return codigo;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        //alterar
        public void alterar(int codigo, int venda, DateTime vencimento, Double original, Double alterado, Double pago, String status, DateTime? pagamento,
            Double juros, Double desconto, String observacao, String parcela, Double? cr_valorRestante, Double? cr_multa)
        {
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "UPDATE ContasAReceber" +
                    " SET cr_vendas=@venda, cr_dataVencimento=@vencimento, cr_valorOriginal=@original,"+
                    " cr_valorAlterado=@alterado, cr_valorPago=@pago, cr_status=@status, cr_dataPagamento=@pagamento,"+
                    " cr_juros=@juros, cr_desconto=@desconto, cr_observacao=@observacao, cr_parcela=@parcela, cr_valorRestante=@cr_valorRestante, cr_multa=@cr_multa " +
                    " WHERE cr_codigo = @codigo";
                cmd.Parameters.Add(new SqlParameter("@codigo", SqlDbType.Int)).Value = codigo;
                cmd.Parameters.Add(new SqlParameter("@venda", SqlDbType.Int)).Value = venda;
                cmd.Parameters.Add(new SqlParameter("@vencimento", SqlDbType.DateTime)).Value = vencimento;
                cmd.Parameters.Add(new SqlParameter("@original", SqlDbType.Float)).Value = original;
                cmd.Parameters.Add(new SqlParameter("@alterado", SqlDbType.Float)).Value = alterado;
                cmd.Parameters.Add(new SqlParameter("@pago", SqlDbType.Float)).Value = pago;
                cmd.Parameters.Add(new SqlParameter("@status", SqlDbType.VarChar)).Value = status;
                if (pagamento != null)
                    cmd.Parameters.Add(new SqlParameter("@pagamento", SqlDbType.DateTime)).Value = pagamento;
                else
                    cmd.Parameters.Add(new SqlParameter("@pagamento", SqlDbType.DateTime)).Value = DBNull.Value;
                cmd.Parameters.Add(new SqlParameter("@juros", SqlDbType.Float)).Value = juros;
                cmd.Parameters.Add(new SqlParameter("@desconto", SqlDbType.Float)).Value = desconto;
                cmd.Parameters.Add(new SqlParameter("@observacao", SqlDbType.VarChar)).Value = observacao;
                cmd.Parameters.Add(new SqlParameter("@parcela", SqlDbType.VarChar)).Value = parcela;
                if(cr_valorRestante!=null)
                    cmd.Parameters.Add(new SqlParameter("@cr_valorRestante", SqlDbType.Float)).Value = cr_valorRestante;
                else
                    cmd.Parameters.Add(new SqlParameter("@cr_valorRestante", SqlDbType.Float)).Value = DBNull.Value;
                if (cr_multa != null)
                    cmd.Parameters.Add(new SqlParameter("@cr_multa", SqlDbType.Float)).Value = cr_multa;
                else
                    cmd.Parameters.Add(new SqlParameter("@cr_multa", SqlDbType.Float)).Value = 0;
                objD.executacomando(cmd);
            }
            catch (Exception ex)
            {

                throw ex;
            }
            cmd = null;
            objD = null;
        }

        public void excluir(int cr_codigo)
        {
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "DELETE FROM ContasAReceber" +
                    " WHERE" +
                    " cr_codigo=@cr_codigo";
                cmd.Parameters.Add(new SqlParameter("@cr_codigo", SqlDbType.Int)).Value = cr_codigo;
                objD.executacomando(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
        }

        public void excluirVendas(int cr_vendas)
        {
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "DELETE FROM ContasAReceber" +
                    " WHERE" +
                    " cr_vendas=@cr_vendas";
                cmd.Parameters.Add(new SqlParameter("@cr_vendas", SqlDbType.Int)).Value = cr_vendas;
                objD.executacomando(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
        }

        //selecionar várias linhas
        public DataTable localizar(String descricao, String coluna)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT * FROM ContasAReceber" +
                    " WHERE " + coluna + " like @descricao";
                cmd.Parameters.Add(new SqlParameter("@descricao",
                    SqlDbType.VarChar)).Value = descricao + "%";
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

        public DataTable localizarLeave(String descricao, String coluna)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT * FROM ContasAReceber" +
                    " WHERE " + coluna + " like @descricao";
                cmd.Parameters.Add(new SqlParameter("@descricao",
                    SqlDbType.VarChar)).Value = descricao;
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }

        //selecionar uma linha - um código
        public int localizar(int codigo)
        {
            DataTable tab = null;
            SqlCommand cmd = null;

            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT * FROM ContasAReceber" +
                    " WHERE cr_codigo = @codigo";
                cmd.Parameters.Add(new SqlParameter("@codigo",
                    SqlDbType.Int)).Value = codigo;
                tab = objD.executaconsulta(cmd);
                cmd = null;
                objD = null;
                if (tab.Rows.Count > 0)
                    return int.Parse(tab.Rows[0][0].ToString());
                else
                    return 0;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        
        public DataTable localizarEmTudo(String descricao)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                cmd.CommandText = "SELECT cr.cr_codigo 'Código da Parcela',c.cli_nome 'Cliente', "+
	                               "v.ven_codigo 'Código da Venda', cr.cr_dataVencimento 'Data de Vencimento', "+
	                               "cr.cr_valorOriginal 'Valor Original', cr.cr_valorAlterado 'Valor Alterado', "+
	                               "cr.cr_status 'Status', "+
                                   "cr.cr_juros 'Juros (%)',cr.cr_desconto 'Desconto (R$)',cr.cr_valorPago 'Valor Pago', " +
                                   "cr.cr_parcela 'Parcelas',cr.cr_dataPagamento 'Data do Pagamento' " +
                                 "FROM Cliente c INNER JOIN Vendas v on c.cli_codigo = v.ven_cliente "+
	                               "INNER JOIN ContasAReceber cr on v.ven_codigo = cr.cr_vendas "+
                                 " WHERE "+
                                 "cr_status = 'Aberto' and "+
                                 "c.cli_nome like @descricao or c.cli_razao_social like @descricao order by cr.cr_codigo";
                cmd.Parameters.Add(new SqlParameter("@descricao",SqlDbType.VarChar)).Value = "%" + descricao + "%";
                tab = objD.executaconsulta(cmd);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            cmd = null;
            objD = null;
            return tab;
        }


        public DataTable localizarPrimeiroUltimo(String descricao)
        {
            DataTable tab = null;
            SqlCommand cmd = null;

            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                if (descricao == "ultimo")
                {
                    cmd.CommandText = "SELECT cr_codigo = max(cr_codigo) FROM ContasAReceber";
                    cmd.Parameters.Add(new SqlParameter("@descricao",
                         SqlDbType.VarChar)).Value = descricao;
                }
                else if (descricao == "primeiro")
                {
                    cmd.CommandText = "SELECT cr_codigo = min(cr_codigo) FROM ContasAReceber";
                    cmd.Parameters.Add(new SqlParameter("@descricao",
                     SqlDbType.VarChar)).Value = descricao;
                }
                tab = objD.executaconsulta(cmd);

            }
            catch (Exception)
            {

                throw;
            }
            return tab;
        }

        public DataTable localizarProxAnterior(String descricao, int codigo)
        {
            DataTable tab = null;
            SqlCommand cmd = null;
            
            try
            {
                objD = new Dados();
                cmd = new SqlCommand();
                if (descricao == "proximo")
                    cmd.CommandText = "SELECT cr_codigo FROM ContasAReceber WHERE cr_codigo = (SELECT MIN(cr_codigo) FROM ContasAReceber WHERE cr_codigo > @codigo)";
                
                else if (descricao == "anterior")
                    cmd.CommandText = "SELECT cr_codigo FROM ContasAReceber WHERE cr_codigo = (SELECT MAX(cr_codigo) FROM ContasAReceber WHERE cr_codigo < @codigo)"; ;
                    
                cmd.Parameters.Add(new SqlParameter("@codigo",SqlDbType.Int)).Value = codigo;

                tab = objD.executaconsulta(cmd);
            }
            catch (Exception)
            {
                
                throw;
            }
            return tab;
        }
    }
}
